/**
 * @author yin
 * @time 2022-01-17
 * @description 封装axios请求，实现拦截和通用数据封装
 */

import { message } from 'antd'
import axios from 'axios'
import store from '../store'

// 对通用数据进行封装
const Ajax = axios.create({
    // timeout: 5000,
    baseURL: '/apis'
})

// 实现请求拦截
Ajax.interceptors.request.use(config => {
    let path = ['/user/login', '/user/validate/code', '/user/app/login']
    // 如果是登录请求，则不需要拦截检验token
    if (path.includes(config.url)){
        return config
    } else{
        let token = store.getState().common.token
        // 如果token不存在，就拦截访问
        if (!token) {
            return Promise.reject({code: 0, message: '用户没有登录，无法访问'})
        } else {
            config.headers.token = token
            return config
        }
    }
})

// 实现响应拦截
Ajax.interceptors.response.use(response => {
    if (!!response && response.code === 403){
        message.error('您的票据失效了，请重新登录')
        throw new Error('票据失效')
    } else{
        return response
    }
})


/**
 * 异步请求封装方法
 * @param {{url: string, method: 'POST' | 'PUT' | 'DELETE' | 'GET', data: any, params: any}} req 请求参数 
 * @returns 
 */
// eslint-disable-next-line import/no-anonymous-default-export
export default function(req){
    // 判断传进来的参数是否有url
    if(!req.url) throw new TypeError('请求方法，url必传')

    // 因为要实现使用async + await语法，所以要返回一个Promise.resolve
    return new Promise(resolve => {
        // 发起请求
        Ajax.request({
            // 请求地址
            url: req.url,
            // 请求方式
            method: req.method || 'GET',
            //请求体参数
            data: req.data || {},
            //url地址传参
            params: req.params || {},
            //超时设置
            timeout: req.timeout || 5000,
            // 通过一个回调方法获取数据传输进度
            // (progressEvent: any) => void 表示为一个函数
            onUploadProgress: req.callback || (() => {})
        }).then(
            function({data}){
                resolve(data)
            }
        ).catch(
            function(e){
                resolve(e)
            }
        )
    })
}